package com.yh.vo;

import cn.hutool.core.util.ObjectUtil;
import com.yh.entity.Hall;
import com.yh.entity.HallType;
import com.yh.entity.Layout;
import com.yh.utils.Constants;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
/**
 * 记录每个影厅的详细信息
 *
 * @author yuhuan
 * @date 2022/01/13
 * */
public class HallVO implements Serializable {
    private Integer hallId;
    /**
     * 放映厅名称
     */
    private String hallName;
    /**
     * 放映厅所属类型
     */
    private Integer hallTypeId;
    /**
     * 放映厅容量
     */
    private Integer hallCapacity;
    /**
     * 所属影院编号
     */
    private Integer cinemaId;
    /**
     * 所属影院的名称
     */
    private String cinemaName;

    /**
     * 影厅信息
     */
    private Hall hall;
    /**
     * 影厅布局
     */
    private List<Layout> layout;
    /**
     * 影厅类型
     */
    private HallType hallType;

    public HallVO() {
    }

    public HallVO(Hall hall) {
        this(hall, null, null);
    }

    public HallVO(Hall hall, List<Layout> layout, HallType hallType) {
        this.hall = hall;
        this.layout = layout;
        this.hallType = hallType;
    }

    /**
     * 检查影厅的容量是否已经初始化；如果容量未曾初始化将尝试从座位的布局信息中执行初始化
     *
     * @return 影厅的容量是否已经被初始化
     */
    public boolean examineHallCapacity() {
        if (ObjectUtil.isNotEmpty(this.hallCapacity) && this.hallCapacity!=0) {
            return true;
        }
        if (ObjectUtil.isEmpty(this.layout)) {
            return false;
        }
        // 设置容量的初始值，防止空指针
        this.hallCapacity = 0;
        // 计算影厅的容量（即：座位状态标记为待出售的座位有多少个）
        this.layout.forEach(lt -> {
            List<String> seatStateIds = lt.getSeatStateIds();
            seatStateIds.forEach(state -> {
                if (state.equals(Constants.SeatLayoutData.SELECTABLE_SEAT)) {
                    this.hallCapacity ++;
                }
            });
        });
        // 将影厅容量保存到影厅的基本信息；如果其对象存在的话
        if (ObjectUtil.isNotEmpty(this.hall)) {
            this.hall.setHallCapacity(this.hallCapacity);
        }
        return true;
    }
}
